# -*- coding: utf-8; mode: Python -*-
# SConstruct for ra/box

# (c) Daniel Llorens - 2015-2016, 2019
# This library is free software; you can redistribute it and/or modify it under
# the terms of the GNU Lesser General Public License as published by the Free
# Software Foundation; either version 3 of the License, or (at your option) any
# later version.

# FIXME Shared pieces with {test,bench,docs}/SConstruct

import os, string, atexit
from os.path import join, abspath
from importlib.machinery import SourceFileLoader
ra = SourceFileLoader('ra', '../config/ra.py').load_module()
# FIXME pick BLAS flags from here.
try:
    Import('top')
except:
    top = { 'skip_summary': False, 'sanitize': False, 'use_blas': False }
raflags = ra.flags(top['sanitize'])

vars = Variables()
vars.AddVariables(PathVariable('variant_dir', 'build directory', '.', PathVariable.PathIsDirCreate))

env = Environment(options=vars,
                  ENV=dict([(k, os.environ[k] if k in os.environ else '')
                            for k in ['PATH', 'HOME', 'TERM', 'LD_RUN_PATH', 'DYLD_LIBRARY_PATH',
                                      'RPATH', 'LIBRARY_PATH', 'TEXINPUTS', 'GCC_COLORS', 'BOOST_ROOT']]))
variant_dir = env['variant_dir']

for var, default in [('CC', 'gcc'), ('CXX', 'g++'), ('FORTRAN', 'gfortran')]:
    ra.take_from_environ(env, var, default=default)
for var in ['FORTRANFLAGS', 'LINKFLAGS', 'CCFLAGS', 'CXXFLAGS']:
    ra.take_from_environ(env, var, wrapper=lambda x: x.split())
for var in ['RPATH', 'LIBPATH']:
    ra.take_from_environ(env, var, wrapper=lambda x: [x])

arch = os.popen('../config/config.guess').read()
cppcomp = os.popen('%s --version' % env['CXX']).read()

if (arch.find('apple-darwin') >= 0) and (cppcomp.find('g++') >= 0):
    archflags=['-march=native', '-Wa,-q']
else:
    archflags=['-march=native']

env.Prepend(CPPPATH=['..', '.'],
            CCFLAGS=archflags if str(env['CCFLAGS']).strip()=='' else '',
            CXXFLAGS=raflags['CXXFLAGS'],
            LINKFLAGS=raflags['LINKFLAGS'])

[ra.to_test_ra(env, variant_dir)(example)
 for example in ['genfrom', 'tuple-construct', 'iterator-as-ravel']]

if not top['skip_summary']:
    atexit.register(lambda: ra.print_summary(GetBuildFailures, 'ra/box'))
